/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package fr.cpe.dp.projet2.utils;

import java.lang.reflect.Constructor;

/**
 *
 * @author Benoit
 */
public class Reflection {
    /**
     * Retrouve un constructeur potentiellement acceptable avec la liste des arguments
     * fournis. L'intérêt de cette méthode est de pouvoir utiliser la réflexion 
     * et le polymorphisme à l'exécution du programme.
     * 
     * Solution inspirée par ce post : http://www.velocityreviews.com/forums/t237357-re-java-lang-nosuchmethodexception.html#post_message_1162364
     * 
     * @param Class
     * @param parametersType
     * @return Constructor
     */
    public static Constructor getPossibleConstructor(Class<?> objectClass, Class[] parametersType) {
        Constructor[] ctors = objectClass.getConstructors();
        
        for (Constructor constructor : ctors) {
            Class[] parametersClass = constructor.getParameterTypes();

            if (parametersClass.length == parametersType.length) {
                boolean found = true;
                for (int i = 0; i < parametersClass.length; ++i) {
                    if (!parametersClass[i].isAssignableFrom(parametersType[i])) {
                        found = false;
                        break;
                    }
                }
                
                if(found) {
                    return constructor;
                }
            }

        }
        return null;
    }
}
